﻿(function ($, undefined) {
    "use strict";

    $.fn.megaMenu = function() {

        return this.each(function() {

            var menu = $(this);

            function close() {
                menu.removeClass("active");
                menu.addClass("inactive");
                menu.find("li.active").removeClass("active");
                $("html").unbind("close.mega-menu");
            }

            function activateMenuItem(li) {
                
                close();

                menu.removeClass("inactive");
                menu.addClass("active");
                li.addClass("active");

                $("html").bind("click.mega-menu", function(e) {
                    if ($.contains(menu[0], e.target) === false) {
                        close();
                    }
                });
            }

            function activateNextMenuItem() {
                var nextMenuItem = menu.find("li.active").next();
                if (nextMenuItem.length === 0) {
                    nextMenuItem = menu.find("li:not(.mega-sub-menu li)").first();
                }
                activateMenuItem(nextMenuItem);
            }

            function activatePreviousMenuItem() {
                var previousMenuItem = menu.find("li.active").prev();
                if (previousMenuItem.length === 0) {
                    previousMenuItem = menu.find("li:not(.mega-sub-menu li)").last();
                }
                activateMenuItem(previousMenuItem);
            }

            menu.keypress(function(e) {
                if (e.keyCode === 39) {
                    activateNextMenuItem();
                } else if (e.keyCode === 37) {
                    activatePreviousMenuItem();
                } else if (e.keyCode === 27) {
                    close();
                }
            });

            menu.find("a:not(.mega-sub-menu a)").click(function(e) {
                activateMenuItem($(this).closest("li"));
                e.preventDefault();
                e.stopImmediatePropagation();
            });

            menu.addClass("inactive");
        });
    };
})(jQuery);